﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SeguradoraIA.Business
{
    public class Perceptron
    {
        //public void CalcularPesos(ref double x0, ref double w0, ref double w1, ref double w2, ref double w3, List<LinhaTreinamento> oListTreinamento)
        //{
        //    //A Formula: (u) = (N (somatório) i=1 ) * wi*xi+w0*x0
        //    double u = 0;
        //    int y = 0;
        //    bool bDescobriuPeso = false;

        //    while (!bDescobriuPeso)
        //    {
        //        bDescobriuPeso = true;
        //        foreach (LinhaTreinamento oLinhaTreinamento in oListTreinamento)
        //        {
        //            for (int i = 0; i < 1000; i++)
        //            {
        //                u = CalcularTheta(u, x0, w0, w1, w2, w3, oLinhaTreinamento);
        //                y = u >= 0 ? 1 : -1;
        //                if (y != oLinhaTreinamento.D)
        //                {
        //                    RecalcularPesos(ref w0, ref w1, ref w2, ref w3, y, oLinhaTreinamento, x0);
        //                    bDescobriuPeso = false;
        //                }
        //                else
        //                {
        //                    oLinhaTreinamento.StrClasse = y == 1 ? "Classe A" : "Classe B";
        //                    break;
        //                }
        //                if (i == 999)
        //                    throw new Exception("Chegou nas 1000 interações e não foi possivel chegar no resultado final.");
        //            }
        //        }
        //    }

        //}
        //private double CalcularTheta(double u, double x0, double w0, double w1, double w2, double w3, LinhaTreinamento oLinhaTreinamento)
        //{
        //    //wi*xi+w0*x0 =>
        //    u = x0 * w0 + oLinhaTreinamento.X1 * w1 + oLinhaTreinamento.X2 * w2 + oLinhaTreinamento.X3 * w3;

        //    return u;
        //}
        ///// <summary>
        ///// w(t+1) = w anterior + N * ( d k - y) * X K
        ///// 
        /////Onde:
        /////W * (t+1) => Peso sináptico atual
        /////Wi=> Peso sináptico antigo
        /////N => Taxa de aprendizagem (constante => 0<N<<1)
        /////DK=> Valor desejado para a K-ésima amostra de treinamento
        /////y=> valor da saída produzida pelo perceptron.
        /////
        ///// Exemplo: w0 = 0,5 + 0,4 *(-1)*(-1-(+1))
        ///// </summary>
        //private void RecalcularPesos(ref double w0, ref double w1, ref double w2, ref double w3, double y, LinhaTreinamento oLinhaTreinamento, double x0)
        //{
        //    w0 = w0 + 0.4 * x0 * (oLinhaTreinamento.D - (y));
        //    w1 = w1 + 0.4 * oLinhaTreinamento.X1 * (oLinhaTreinamento.D - (y));
        //    w2 = w2 + 0.4 * oLinhaTreinamento.X2 * (oLinhaTreinamento.D - (y));
        //    w3 = w3 + 0.4 * oLinhaTreinamento.X3 * (oLinhaTreinamento.D - (y));
        //}


    }
}